package demo02;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 *  java.ytil.Iterator接口：迭代器（对集合进行遍历）
 *  两个常用方法：
 *      boolean hasNext()：如果还有元素可以迭代，则返回 true
 *          判断集合中还有没有下一个元素，有就返回true，没有就返回false
 *      E next()：返回迭代的下一个元素
 *          取出集合中的下一个元素
 *  Iterator迭代器是一个接口，无法直接使用，需要使用Iterator接口的实现类对象
 *  Collection接口中有个方法：iterator()，该方法返回的就是迭代器的实现类对象
 *      Iterator<E> iterator()：返回在此 collection 集合的元素上进行迭代的迭代器
 * 
 *  迭代器的使用步骤：
 *      1. 使用集合中的方法iterator()获取迭代器的实现类对象，使用Iterator接口接收（多态）
 *      2. 使用Iterator接口中的方法hasNext判断有没有下一个元素
 *      3. 使用Iterator接口中的方法next取出集合中的下一个元素
 */
public class Demo01Iterator {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>(); // 创建集合对象
        collection.add("土司鸡"); // 添加集合元素
        collection.add("老虎");
        collection.add("粹花");
        collection.add("哈利");

        /*
         *  1. 使用集合中的方法iterator()获取迭代器的实现类对象，使用Iterator接口接收（多态）
         *  注意：Interator<E>接口也是有泛型的，迭代器的泛型根据集合而定，集合是什么泛型，迭代器就是什么泛型
         */
        Iterator<String> iterator = collection.iterator(); // 多态：创建的是接口类型，其实际是实现类对象

        // 2. 使用Iterator接口中的方法hasNext判断有没有下一个元素
        boolean b = iterator.hasNext();
        System.out.println(b); // true

        // 3. 使用Iterator接口中的方法next取出集合中的下一个元素
        String string = iterator.next();
        System.out.println(string); // 土司鸡

        // 使用循环遍历集合所有元素
        while(iterator.hasNext()) { // 判断条件：集合是否存在下一个元素，存在则执行循环体，不存在则结束循环
            System.out.println(iterator.next()); // 老虎 粹花 哈利
        }

        System.out.println(iterator.hasNext()); // false
        System.out.println(iterator.next()); // 抛出异常，NoSuchElementException没有元素异常
    }
}
